<?php
Class ModelPDO 
{
    /**
    * Свойства для инициализации объектов и ресурсов
    *
    * @var $msg     Object         Объект очереди сообщений
    * @var $db         Object        PDO Объект
    * @var $result     Object        PDOStatement Объект
    */
    public $msg;
    public $result;
    private $db;
    
    /**
    * Конструктор
    *
    * Получает ссылку на объект очереди сообщений и производит соединение с БД
    *
    * @param &$msg Object     Ссылка на объект очереди сообщений
    * @param &$config Array Ссылка на массив параметров
    */
    function __construct(&$msg, &$config) 
    {
        $this->msg = &$msg;
        $this->config = &$config;
        // Cоединение с БД
        try 
        {  
            $this->db = new PDO("mysql:host=".$this->config['host'].";dbname=".$this->config['dbname'], $this->config['user'], $this->config['password']);  
        }  
        catch(PDOException $e) 
        {  
            try 
            {  
                $this->db = new PDO("mysql:host=".$this->config['host'].";", $this->config['user'], $this->config['password']);  
                $this->db->query("CREATE DATABASE ".$this->config['dbname'].";");
                $this->db = new PDO("mysql:host=".$this->config['host'].";dbname=".$this->config['dbname'], $this->config['user'], $this->config['password']); 
            }  
            catch(PDOException $e) 
            {  
                die('Ошибка соединения: ' . $e->getMessage());
            }
        }
        // Проверка таблиц на существование
        try 
        {  
            $this->result = $this->db->query("SHOW TABLES LIKE 'gb_comments'")->rowCount();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
        if (!$this->result) 
        {
            try 
            {  
                $this->db->query("
                CREATE TABLE IF NOT EXISTS gb_comments (
                `id` int(10) NOT NULL AUTO_INCREMENT,
                `postid` int(10) NOT NULL,
                `autor` varchar(255) NOT NULL,
                `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `text` text NOT NULL,
                UNIQUE KEY id (id)
                );
                ");
            }  
            catch(PDOException $e) 
            {  
                die('Ошибка соединения: ' . $e->getMessage());
            }
        }
        try 
        {  
            $this->result = $this->db->query("SHOW TABLES LIKE 'gb_posts'")->rowCount();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
        if (!$this->result) 
        {
            try 
            {  
                $this->db->query("
                CREATE TABLE IF NOT EXISTS gb_posts (
                `id` int(10) NOT NULL AUTO_INCREMENT,
                `autor` varchar(255) NOT NULL,
                `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `text` text NOT NULL,
                UNIQUE KEY id (id)
                );
                ");
            }  
            catch(PDOException $e) 
            {  
                die('Ошибка соединения: ' . $e->getMessage());
            }
        }
    }
    /**
    * Добавление в БД
    *
    * Метод добавляет в БД сообщение или комментарий в зависимости от id
    *
    * @param $id string    Идентификатор сообщения для добавления комментария
    * @param $autor string    Имя автора
    * @param $text string    Текст сообщения или комментария
    */
    public function add($id, $autor, $text) 
    {
        try 
        {  
            if ($id) 
            {
                $this->result = $this->db->prepare("
                    INSERT INTO gb_comments (postid, autor, text)
                    VALUES (:id, :autor, :text);
                "); 
                $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
                $this->result->bindParam(':autor', $autor, PDO::PARAM_STR); 
                $this->result->bindParam(':text', $text, PDO::PARAM_STR); 
                $this->result->execute();
            } else 
            {
                $this->result = $this->db->prepare("
                    INSERT INTO gb_posts (autor, text)
                    VALUES ( :autor, :text);
                "); 
                $this->result->bindParam(':autor', $autor, PDO::PARAM_STR); 
                $this->result->bindParam(':text', $text, PDO::PARAM_STR);
                $this->result->execute();
            }
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
    }
    /**
    * Изменение сообщения
    *
    * Метод изменяет целевое сообщение в БД
    *
    * @param $id string    Идентификатор сообщения
    * @param $text string    Текст сообщения
    */
    public function changepost($id, $text) 
    {
        try 
        {  
            $this->result = $this->db->prepare("
                UPDATE gb_posts
                SET text = :text
                WHERE id = :id;
            "); 
            $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
            $this->result->bindParam(':text', $text, PDO::PARAM_STR); 
            $this->result->execute();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
    }
    /**
    * Изменение комментария
    *
    * Метод изменяет целевой комментарий в БД
    *
    * @param $id string    Идентификатор комментария
    * @param $text string    Текст комментария
    */
    public function changecomment($id, $text) 
    {
        try 
        {  
            $this->result = $this->db->prepare("
                UPDATE gb_comments
                SET text = :text
                WHERE id = :id;
            "); 
            $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
            $this->result->bindParam(':text', $text, PDO::PARAM_STR); 
            $this->result->execute();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
    }
    /**
    * Удаление сообщения
    *
    * Метод удаляет целевое сообщение и его комментарии из БД
    *
    * @param $id string    Идентификатор сообщения
    */
    public function deletepost($id) 
    {
        try 
        {  
            $this->result = $this->db->prepare("DELETE FROM gb_posts WHERE id = :id ;"); 
            $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
            $this->result->execute();
            $this->result = $this->db->prepare("DELETE FROM gb_posts WHERE postid = :id ;"); 
            $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
            $this->result->execute();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
    }
    /**
    * Удаление комментария
    *
    * Метод удаляет целевой комментарий из БД
    *
    * @param $id string    Идентификатор комментария
    */
    public function deletecomment($id) 
    {
        try 
        {  
            $this->result = $this->db->prepare("DELETE FROM gb_comments WHERE id = :id ;"); 
            $this->result->bindParam(':id', $id, PDO::PARAM_INT);  
            $this->result->execute();
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
    }
    /**
    * Получение сообщений и комментариев
    *
    * Метод получает все сообщения с комментариями из БД
    *
    * @return Array     Возвращает все сообщения и комментарии
    */
    public function getall() 
    {
        try 
        {  
            $this->result = $this->db->query("
                SELECT gb_posts.id, gb_posts.autor, gb_posts.time, gb_posts.text, gb_comments.id, gb_comments.autor, gb_comments.time, gb_comments.text 
                FROM `gb_posts` 
                LEFT OUTER JOIN `gb_comments` 
                ON gb_posts.id = gb_comments.postid
                ORDER BY gb_posts.time DESC, gb_comments.time DESC;
            ");     
        }  
        catch(PDOException $e) 
        {  
            die('Ошибка соединения: ' . $e->getMessage());
        }
        return $this->result->fetchAll();
    }
}